package service

import (
	"activity_srv/basic/config"
	__ "activity_srv/basic/proto"
	"activity_srv/handler/dao"
	"activity_srv/handler/models"
	"context"
	"errors"
	"time"
)

// 创建拼团
func (s *Serve) CreateGroupP(_ context.Context, in *__.CreateGroupPReq) (*__.CreateGroupPResp, error) {
	// 1. 检查用户是否有购买资格
	canJoin, err := dao.CheckJoinEligibility(in.UserId, in.GroupGid)
	if err != nil {
		return nil, err
	}
	if !canJoin {
		return nil, errors.New("没有购买资格")
	}
	// 2. 实现创建拼团的逻辑
	resp, err := dao.CreateGroupBuying(in)
	if err != nil {
		return nil, err
	}

	// 3. 生成邀请码并返回
	if resp != nil && resp.GroupId > 0 {
		// 生成邀请码
		inviteCode, err := dao.GetGroupInvitationCode(in.UserId, resp.GroupId)
		if err != nil {
			// 邀请码生成失败不影响拼团创建成功
			return nil, errors.New("生成邀请码失败:" + err.Error())
		} else {
			// 设置邀请码到响应中
			resp.InviteCode = inviteCode
		}
	}

	return resp, nil
}

// 参与拼团
func (s *Serve) JoinGroupP(_ context.Context, in *__.JoinGroupPReq) (*__.JoinGroupPResp, error) {
	// 检查是否通过邀请码参与拼团
	if in.InviteCode != "" {
		// 解析邀请码获取拼团信息
		createTime, _, groupId, err := dao.ParseGroupInvitationCode(in.InviteCode)
		if err != nil {
			return nil, errors.New("邀请码无效: %v" + err.Error())
		}

		// 检查邀请码是否过期（7天有效期）
		if time.Since(createTime) > 7*24*time.Hour {
			return nil, errors.New("邀请码已过期")
		}

		// 根据拼团ID获取拼团信息
		var group models.GroupBuying
		group.Id = uint64(groupId)
		if err := config.DB.Where("id = ?", groupId).First(&group).Error; err != nil {
			return nil, errors.New("邀请的拼团不存在")
		}

		// 使用邀请码对应的拼团编号
		in.GroupOrderNo = group.GroupNum
	} else if in.GroupOrderNo == "" {
		return nil, errors.New("请提供拼团编号或邀请码")
	}

	// 1. 检查用户是否有购买资格
	// 查看拼团订单号
	var group models.GroupBuying
	if err := group.GetGroupByGroupNum(in.GroupOrderNo); err != nil {
		return nil, err
	}
	// 检查用户是否有购买资格
	canJoin, err := dao.CheckJoinEligibility(in.UserId, int64(group.GroupGid))
	if err != nil {
		return nil, err
	}
	if !canJoin {
		return nil, errors.New("没有购买资格")
	}

	// 2. 参与拼团
	resp, err := dao.JoinGroupBuying(in)
	if err != nil {
		return nil, err
	}

	return resp, nil
}

// 获取拼团详情
func (s *Serve) GetGroupDetail(_ context.Context, in *__.GroupDetailReq) (*__.GroupDetailResp, error) {
	detail, err := dao.GetGroupDetail(in)
	if err != nil {
		return nil, err
	}

	return detail, nil
}

// 支付回调
func (s *Serve) PaymentCallback(_ context.Context, in *__.PaymentCallbackReq) (*__.PaymentCallbackResp, error) {
	resp, err := dao.HandlePaymentCallback(in)
	if err != nil {
		return nil, err
	}

	return resp, nil
}

// 获取用户拼团记录
func (s *Serve) UserGroupRecords(_ context.Context, in *__.UserGroupRecordsReq) (*__.UserGroupRecordsResp, error) {
	records, err := dao.GetUserGroupRecords(in.UserId, in.Page, in.PageSize)
	if err != nil {
		return nil, err
	}

	// 查询总条数
	total, err := dao.GetUserGroupRecordsTotal(in.UserId)
	if err != nil {
		return nil, err
	}

	return &__.UserGroupRecordsResp{
		Records: records,
		Total:   total,
	}, nil
}
